﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Modelo;

namespace JuegoBomberman.Vistas
{
    public class MapaVista
    {
        private Mapa mapa;
        Rectangle rectDeDibujo;
        Dictionary<String, Texture2D> coleccionImagenes;
        private List<Posicion> posicionesExplosion;

        public MapaVista(Mapa mapa)
        {
            this.mapa = mapa;
            rectDeDibujo = new Rectangle(0, 50, 705, 611);
            coleccionImagenes = new Dictionary<string, Texture2D>();
            this.posicionesExplosion = new List<Posicion>();
        }

        public void cargarImagenes(ContentManager content)
        {
            coleccionImagenes.Add("acero", content.Load<Texture2D>("Imagenes/acero"));
            coleccionImagenes.Add("borde", content.Load<Texture2D>("Imagenes/borde"));
            coleccionImagenes.Add("cemento", content.Load<Texture2D>("Imagenes/cemento"));
            coleccionImagenes.Add("fondo", content.Load<Texture2D>("Imagenes/fondo"));
            coleccionImagenes.Add("ladrillo", content.Load<Texture2D>("Imagenes/ladrillo"));
            coleccionImagenes.Add("Habano", content.Load<Texture2D>("Imagenes/Powerups/habano"));
            coleccionImagenes.Add("Timer", content.Load<Texture2D>("Imagenes/Powerups/reloj"));
            coleccionImagenes.Add("ToleTolePowerUp", content.Load<Texture2D>("Imagenes/bombaToleTole"));
            coleccionImagenes.Add("Molotov", content.Load<Texture2D>("Imagenes/molotov"));
            coleccionImagenes.Add("ToleTole", content.Load<Texture2D>("Imagenes/bombaToleTole"));
            coleccionImagenes.Add("Fuego", content.Load<Texture2D>("Imagenes/fuego"));
            coleccionImagenes.Add("Salida", content.Load<Texture2D>("Imagenes/puerta"));
        }

        public void cargarPosicionesExplosion(List<Posicion> posicionesAfectadas)
        {
            this.posicionesExplosion = posicionesAfectadas;
        }

        public void Dibujarse(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(coleccionImagenes["fondo"], rectDeDibujo, Color.White);
            this.dibujarBordes(spriteBatch);
            this.dibujarObstaculos(spriteBatch);
            this.dibujarEscenario(spriteBatch);
        }

        private void dibujarBordes(SpriteBatch spriteBatch)
        {
            for (int i = 0; i < 15; i++)
            {
                //Dibujo los bordes superior e inferior.
                spriteBatch.Draw(coleccionImagenes["borde"], new Vector2(rectDeDibujo.Left + i * 47, rectDeDibujo.Top), Color.White);
                spriteBatch.Draw(coleccionImagenes["borde"], new Vector2(rectDeDibujo.Left + i * 47, rectDeDibujo.Top + 12 * 47), Color.White);

                //Dibujo los bordes laterales.
                if (i < 13)
                {
                    spriteBatch.Draw(coleccionImagenes["borde"], new Vector2(rectDeDibujo.Left, rectDeDibujo.Top + i * 47), Color.White);
                    spriteBatch.Draw(coleccionImagenes["borde"], new Vector2(rectDeDibujo.Left + 14 * 47, rectDeDibujo.Top + i * 47), Color.White);
                }
            }
        }

        private void dibujarEscenario(SpriteBatch spriteBatch)
        {
            for (int linea = 0; linea < 11; linea++)
            {
                for (int celda = 0; celda < 13; celda++)
                {
                    Celda actual = mapa.obtenerCelda(celda, linea);
                    if (!actual.getCaminable())
                    {
                        Texture2D bloque = coleccionImagenes[actual.ObtenerBloque().ToString()];
                        spriteBatch.Draw(bloque, new Vector2(rectDeDibujo.Left + 47 * (celda + 1), rectDeDibujo.Top + 47 * (linea + 1)), Color.White);
                    }
                }
            }
        }

        private void dibujarObstaculos(SpriteBatch spriteBatch)
        {
            //dibujo la puerta
            Texture2D imagenPuerta = coleccionImagenes["Salida"];
            List<IColisionable> obstaculos = this.mapa.obtenerObstaculos();
            Posicion posPuerta = mapa.obtenerPosicionCentroDeCelda(new Posicion(mapa.ObtenerSalida().getX() * 47, mapa.ObtenerSalida().getY() * 47));
            Vector2 posicionPuerta = new Vector2(rectDeDibujo.Left + 47 + posPuerta.getX() - 47 / 2, rectDeDibujo.Top + 47 + posPuerta.getY() - 47 / 2);
            spriteBatch.Draw(imagenPuerta, posicionPuerta, Color.White);

            //dibujo los obstaculos
            foreach (IColisionable obstaculo in obstaculos)
            {
                Type tipo = obstaculo.GetType();
                Texture2D imagen = coleccionImagenes[tipo.Name];
                Posicion pos = mapa.obtenerPosicionCentroDeCelda(new Posicion(obstaculo.getPosX(), obstaculo.getPosY()));
                Vector2 posicion = new Vector2(rectDeDibujo.Left + 47 + pos.getX() - 47 / 2, rectDeDibujo.Top + 47 + pos.getY() - 47 / 2);
                spriteBatch.Draw(imagen, posicion, Color.White);
            }

            //dibujo la explosion
            foreach (Posicion posicionAfectada in posicionesExplosion)
            {
                Texture2D imagen = coleccionImagenes["Fuego"];
                Posicion pos = mapa.obtenerPosicionCentroDeCelda(posicionAfectada);
                Vector2 posicion = new Vector2(rectDeDibujo.Left + 47 + pos.getX() - 47 / 2, rectDeDibujo.Top + 47 + pos.getY() - 47 / 2);
                spriteBatch.Draw(imagen, posicion, Color.White);
            }
        }

    }
}
